// 路由配置文件
// 引入插件
import Vue from 'vue';
import VueRouter from 'vue-router';
import store from '../store';
// 使用插件
Vue.use(VueRouter);


import routes from './routes';

// 把VueRouter原型对象的push、replace备份
let originPush = VueRouter.prototype.push;
let originReplace = VueRouter.prototype.replace;

// 重写 push | replace
VueRouter.prototype.push = function (location, resolve, reject) {
  if (resolve && reject) {
    // call apply 区别
    // 相同：都可以调用函数一次，都可以篡改函数的上下文一次
    // 不同：call 与 apply 传递参数：call传递参数用,隔开 apply 方法执行传递数组
    originPush.call(this, location, resolve, reject)
  } else {
    originPush.call(this, location, () => { }, () => { })
  }

}

VueRouter.prototype.replace = function (location, resolve, reject) {
  if (resolve && reject) {
    // call apply 区别
    // 相同：都可以调用函数一次，都可以篡改函数的上下文一次
    // 不同：call 与 apply 传递参数：call传递参数用,隔开 apply 方法执行传递数组
    originReplace.call(this.location, resolve, reject)
  } else {
    originReplace.call(this, location, () => { }, () => { })
  }
}

// 配置路由
let router = new VueRouter({
  routes,
  // 滚动行为
  scrollBehavior(to, from, savedPosition) {
    // return 期望滚动到哪个的位置
    return { y: 0 }
  }
});
// 全局守卫：前置守卫（在路由跳转之间进行判断）
router.beforeEach(async (to, from, next) => {
  // to： 获取你要跳转到的路由信息
  // from： 获取你从哪个路由而来的信息
  // next： 放行函数   next() 放行    next(path) 放行到指定路由   next(false)

  // 用户登录了才有token
  let token = store.state.user.token
  // 用户信息
  let name = store.state.user.userInfo.name
  // 用户已登录
  if (token) {
    // 登录后禁止前往登录页面
    if (to.path == "/login") {
      next('/')
    } else {
      // 如果已有用户名
      if (name) {
        next()
      } else {
        // 没有用户信息  派发actions让仓库存储用户信息在存储
        try {
          // 获取用户信息成功
          await store.dispatch("getUserInfo")
          next()
        } catch (error) {
          // token 失效了
          // 清除原 token 回到登录页重新登录
          await store.dispatch("userLogout")
          next("/login")
        }
      }
    }
  } else {
    // 用户未登录
    // 未登录：不能去交易、支付、个人中心
    // 未登录去以上页面跳转到登录页面
    let topath = to.path
    if (topath == '/trade' || topath.indexOf('/pay') != -1 || topath.indexOf('/center') != -1) {
      // 把未登录的时候没有去的信息存储与地址栏中【路由】
      next('/login?redirect=' + topath)
    } else {
      // 其他页面 放行
      next()
    }
  }
})
export default router
